/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package SintaticoPacote;

//import SintaticoPacote.TratamentoErro.Erro;
//import SintaticoPacote.TratamentoErro.ErroTabela;
//import SintaticoPacote.TratamentoErro.TabelaErros;
import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;




public class declaracaoVariaveis {

    private TabelaSimbolos tabelaSimbolos;

     //Tipos tipo = new Tipos();

    public declaracaoVariaveis(TabelaSimbolos tabelaSimbolos)
    {
        this.tabelaSimbolos = tabelaSimbolos;
    }

    //lari: os system.out foi eu ki coloquei pra testar
    public boolean declaraVariaveis(){

       if(tabelaSimbolos.getLookahead().equals("typedef"))
        tabelaSimbolos.reconhecer("typedef");

        if(Tipos.apenasCompara(tabelaSimbolos))
        {
            //
            String guardaTipo = tabelaSimbolos.getLookahead();
            // salva tipo
            tabelaSimbolos.salvaTipo(guardaTipo);
            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());

            if(tabelaSimbolos.getTipo().equals("identificador")){

                tabelaSimbolos.insertCategoria("variavel");
                tabelaSimbolos.insertTipoVariavel();
                tabelaSimbolos.insertEscopo();

                //e agora tem ki guardar o escopo, como saber aki se eh local ou global?
                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
            }
            else if(tabelaSimbolos.getLookahead().equals("*"))
            {
                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());//Consome *
                if(tabelaSimbolos.getTipo().equals("identificador"))
                {
                    tabelaSimbolos.insertCategoria("ponteiro");
                    tabelaSimbolos.insertTipoVariavel();
                    tabelaSimbolos.insertEscopo();
                    tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                }
            }
            else
            {
                ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),  "Deveria vir um identificador");
                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                return false;
            }


            if(casoVetor() ==false)
                return false;//erro em reconhecimento do vetor

            if(tabelaSimbolos.getLookahead().equals("="))
            {
                tabelaSimbolos.reconhecer("=");
                if(refatoracao()==false)
                {
                   return false;//Erro em refatoracao
                }
                if(tabelaSimbolos.getLookahead().equals(","))
                {
                    while(tabelaSimbolos.getLookahead().equals(","))
                    {
                        tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                        if(tabelaSimbolos.getTipo().equals("identificador"))
                        {
                            tabelaSimbolos.insertCategoria("variavel");
                            tabelaSimbolos.insertTipoVariavel();
                            tabelaSimbolos.insertEscopo();
                            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                            if(tabelaSimbolos.getLookahead().equals(";"))
                            {
                                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                                return true;
                            }

                        }
                        else if(tabelaSimbolos.getLookahead().equals("*"))
                        {
                            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                            if(tabelaSimbolos.getTipo().equals("identificador"))
                            {
                                tabelaSimbolos.insertCategoria("ponteiro");
                                tabelaSimbolos.insertTipoVariavel();
                                tabelaSimbolos.insertEscopo();
                                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                            }
                        }
                        if(casoVetor()==false)
                            return false;//erro ja tratado em casoVetor()
                        else if(tabelaSimbolos.getLookahead().equals("="))
                        {
                            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                            if(refatoracao()==false)
                                return false;
                            if(tabelaSimbolos.getLookahead().equals(";"))
                            {
                                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                                return true;
                            }
                        }
                    }
                    if(tabelaSimbolos.getLookahead().equals(";"))
                    {
                        tabelaSimbolos.reconhecer(";");
                        return true;
                    }
                    else
                    {
                        ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),  "Deveria vir um ;");
                        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false;
                    }
                }
                if(tabelaSimbolos.getLookahead().equals(";"))
                {
                    tabelaSimbolos.reconhecer(";");
                    return true;
                }
                else
                {
                    ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),  "Deveria vir um ;");
                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false;
                }


            }
            else if(tabelaSimbolos.getLookahead().equals(","))
            {
                    while(tabelaSimbolos.getLookahead().equals(","))
                    {
                        tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                        if(tabelaSimbolos.getTipo().equals("identificador"))
                        {
                            tabelaSimbolos.insertCategoria("variavel");
                            tabelaSimbolos.insertTipoVariavel();
                            tabelaSimbolos.insertEscopo();
                            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                            if(tabelaSimbolos.getLookahead().equals(";"))
                            {
                                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                                return true;
                            }
                        }
                        else if(tabelaSimbolos.getLookahead().equals("*"))
                        {
                            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                            if(tabelaSimbolos.getTipo().equals("identificador"))
                            {
                                tabelaSimbolos.insertCategoria("ponteiro");
                                tabelaSimbolos.insertTipoVariavel();
                                tabelaSimbolos.insertEscopo();
                                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                            }
                        }
                        else
                        {
                            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),  "Deveria vir um identificador");
                            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                            return false;
                        }
                        if(casoVetor()==false)
                            return false;//erro ja tratado em casoVetor()
                        else if(tabelaSimbolos.getLookahead().equals("="))
                        {
                            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                            if(refatoracao()==false)
                                return false;
                            if(tabelaSimbolos.getLookahead().equals(";"))
                            {
                                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                                return true;
                            }
                        }
                        if(tabelaSimbolos.getLookahead().equals(";"))
                        {
                            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                            return true;
                        }
                    }
            }
            else if(tabelaSimbolos.getLookahead().equals(";"))
            {
                 tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                 return true;
            }
        else
        {
            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),  "Deveria ser um Tipo ");
            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false;
        }
       return false;//Controlar que tipo de erro é esse!!!

        }
        return true;
}
    private boolean casoVetor()
    {
        while(tabelaSimbolos.getLookahead().equals("["))
        {
            tabelaSimbolos.reconhecer("[");
            if (tabelaSimbolos.getTipo().equals("numero"))
            {
                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
            }
            else if (tabelaSimbolos.getTipo().equals("identificador"))
            {
                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
            }
            else
            {
                ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),  "Erro de reconhecimento");
                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                return false;
            }
            tabelaSimbolos.reconhecer("]");
        }
        return true;
    }

    private boolean refatoracao()
    {
        if (tabelaSimbolos.getTipo().equals("numero"))
        {
            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
            return true;
        }

        else if(tabelaSimbolos.getLookahead().equals("true")||tabelaSimbolos.getLookahead().equals("false"))
        {
            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
            return true;
        }

        else if(tabelaSimbolos.getTipo().equals("frase")&&tabelaSimbolos.getLookahead().length()==1)
        {
            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
            return true;
        }

        else if(tabelaSimbolos.getTipo().equals("frase")&&tabelaSimbolos.getLookahead().length()>1)
        {
            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
            return true;
        }
        else if(tabelaSimbolos.getLookahead().equals("{"))
        {
            tabelaSimbolos.reconhecer("{");
            if(tabelaSimbolos.getTipo().equals("numero"))
            {
                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                while(tabelaSimbolos.getLookahead().equals(","))
                {
                    tabelaSimbolos.reconhecer(",");
                    if(tabelaSimbolos.getTipo().equals("numero"))
                        tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                    else
                    {
                        ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),  "Deveria ser um número");
                        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false;
                    }
                }
            }
            else
            {
                ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),  "Deveria ser um número");
                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                return false;
            }
            if(tabelaSimbolos.getLookahead().equals("}"))
            {
               tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
               return true;
            }
        }
    return false;
    }
}
